#include<iostream>
#include<fstream>
using namespace std;
using std::ofstream;

class complex{
    public:
    complex(int real,int image)
    :_real(real)
    ,_image(image)
    {}
    void print () const
    {
        cout << _real <<"+" << _image <<"i" << endl;
    }
    //因为要重载++，会对操作数进行修改，所以倾向于使用成员函数的形式进行重载
    //前置++，返回值是是他本身，后置++返回值是他进行变化前的副本
    complex& operator ++()
    {
        cout << "operator++" << endl;
        _image++;
        _real++;
        return *this;
    }

    //后置++运算符重载函数的参数列表中加一个int
    //与前置++进行区分
    //返回类型是对象，不是引用，返回值是对象变化前的副本
    complex operator ++(int)
    {
        cout << "operator ++(int)" << endl;
        //调用拷贝构造创建一个副本，一会用于返回
        complex temp(*this);
        _real++;
        _image++;
        return temp;
    }

    // //cout 为ostream对象返回值为 cout对象本身
    // ostream & operator <<(ostream & os)
    // {
    //     cout << _real << '+'
    //          << _image << 'i' <<endl;
    //     return os;
    // }
    friend
    ostream & operator <<(ostream & os, const complex & rhs);
    
    private:
    int _real;
    int _image;
};
//要声明为类的友元函数
ostream & operator <<(ostream & os, const complex & rhs)
    {
        os << rhs._real << '+'
             << rhs._image << 'i';
        return os;
    }

void test0()
{
    complex c1(2,3);
    // cout << c1; //会报错
    //成员函数形式进行重载，只能实现这种效果
    //因为this指针必然会成为成员函数的第一个参数
    //所以使用时，只能将自定义类型的对象当做第一个操作数
    // c1 << cout;
    // c1.operator<<(cout);//如果将函数重载定义在类中本质是这个
}
void test1()
{
    complex c2(3,6);
    cout << c2 << endl;
    // operator<<(cout, c2)<< endl;//本质

    ofstream ofs("res.txt");
    ofs << c2 << endl;
    operator<<(ofs,c2) <<endl;
}
int main()
{
    test0();
    test1();

    return 0;
}